package com.huhao.wshare.handler;

import jakarta.persistence.EntityNotFoundException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

/**
 * 【新增】全局异常处理器
 * 捕获Service层抛出的特定异常，并将其转换为统一的JSON响应格式。
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理“资源未找到”的异常 (e.g., 动态、评论、用户不存在，或取消点赞时未找到点赞记录)
     * @param ex EntityNotFoundException 异常实例
     * @return 包含 code=404 和 message 的响应体
     */
    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity<Map<String, Object>> handleEntityNotFoundException(EntityNotFoundException ex) {
        Map<String, Object> response = new HashMap<>();
        response.put("code", HttpStatus.NOT_FOUND.value()); // 404
        response.put("message", ex.getMessage()); // 使用Service层抛出时设置的消息
        return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
    }

    /**
     * 处理“访问被拒绝”的异常 (e.g., 修改/删除不属于自己的评论或动态)
     * @param ex AccessDeniedException 异常实例
     * @return 包含 code=403 和 message 的响应体
     */
    @ExceptionHandler(AccessDeniedException.class)
    public ResponseEntity<Map<String, Object>> handleAccessDeniedException(AccessDeniedException ex) {
        Map<String, Object> response = new HashMap<>();
        response.put("code", HttpStatus.FORBIDDEN.value()); // 403
        response.put("message", ex.getMessage()); // 使用Service层抛出时设置的消息
        return new ResponseEntity<>(response, HttpStatus.FORBIDDEN);
    }

    /**
     * 处理其他所有未被捕获的异常，作为通用保障
     * @param ex Exception 异常实例
     * @return 包含 code=500 和通用错误信息的响应体
     */
    @ExceptionHandler(Exception.class)
    public ResponseEntity<Map<String, Object>> handleGeneralException(Exception ex) {
        // 在实际项目中，这里应该记录详细的错误日志
        // log.error("An unexpected error occurred: ", ex);
        Map<String, Object> response = new HashMap<>();
        response.put("code", HttpStatus.INTERNAL_SERVER_ERROR.value()); // 500
        response.put("message", "服务器内部发生未知错误，请联系管理员。");
        return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
